package cn.suchan.jianzhi.sort;

import java.util.ArrayList;

/**
 * 桶排序
 *
 * @author suchan
 * @date 2019/06/18
 */
public class BucketSort {
    /**
     * 桶排序
     *
     * @param array
     * @param bucketSize
     * @return
     */
    public ArrayList<Integer> sort(ArrayList<Integer> array, int bucketSize) {
        if (array == null || array.size() < 2) {
            return array;
        }
        int max = array.get(0), min = array.get(0);
        // 找到最大值最小值
        for (int i = 0; i < array.size(); i++) {
            if (array.get(i) > max) {
                max = array.get(i);
            }
            if (array.get(i) < min) {
                min = array.get(i);
            }
        }
        int bucketCount = (max - min) / bucketSize + 1;
        ArrayList<ArrayList<Integer>> bucketArr = new ArrayList<>(bucketCount);
        ArrayList<Integer> resultArr = new ArrayList<>();
        for (int i = 0; i < bucketCount; i++) {
            bucketArr.add(new ArrayList<>());
        }
        for (int i = 0; i < array.size(); i++) {
            bucketArr.get((array.get(i) - min) / bucketSize).add(array.get(i));
        }
        for (int i = 0; i < bucketCount; i++) {
            if (bucketCount == 1) {
                bucketSize--;
            }
            ArrayList<Integer> temp = sort(bucketArr.get(i), bucketSize);
            for (int j = 0; j < temp.size(); j++) {
                resultArr.add(temp.get(j));
            }
        }
        return resultArr;
    }

    public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList();
        arrayList.add(8);
        arrayList.add(9);
        arrayList.add(1);
        arrayList.add(7);
        arrayList.add(2);
        arrayList.add(3);
        arrayList.add(5);
        arrayList.add(4);
        arrayList.add(6);
        arrayList.add(0);

        BucketSort sort = new BucketSort();
        ArrayList<Integer> sortList = sort.sort(arrayList, arrayList.size());
        System.out.println(sortList);
    }
}
